/* @flow */

import { toArray } from '../util/index';

export function initUse(Vue: GlobalAPI) {
    // 注册插件时，可传入 函数或对象
    Vue.use = function (plugin: Function | Object) {
        // 此处this 指向 Vue
        const installedPlugins = this._installedPlugins || (this._installedPlugins = []);
        if (installedPlugins.indexOf(plugin) > -1) {
            return this;
        }

        // additional parameters
        // 把数组中的第一个元素(plugin)去除
        // 将arguments转换为数组，去掉第一个元素，因为第一个元素为plugin
        const args = toArray(arguments, 1);
        // 把this(Vue)插入第一个元素的位置。args为执行install或者执行函数的参数
        args.unshift(this);

        // 注册插件相当于调用插件
        // 如果注册插件时，传入的是对象，此插件必须拥有一个install方法。调用install方法来进行注册。

        if (typeof plugin.install === 'function') {
            plugin.install.apply(plugin, args);
        } else if (typeof plugin === 'function') {
            plugin.apply(null, args);
        }
        installedPlugins.push(plugin);
        return this;
    };
}
